//https://www.luogu.com.cn/problem/P3374
//线段树单点修改，区间查询
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
#define ll long long
int a[maxn];
struct node{
    int l,r;
    ll sum;
}tr[maxn*4];
void build(int now,int l,int r){
    tr[now].l=l,tr[now].r=r;

    if(l==r){
        tr[now].sum=a[l];
        return;
    }
    int mid=l+r>>1;
    build(now<<1,l,mid);
    build(now<<1|1,mid+1,r);
    tr[now].sum=tr[now<<1].sum+tr[now<<1|1].sum;
    return;
}
void add(int now,int i,int k){
    if(i==tr[now].l&&tr[now].l==tr[now].r){
        tr[now].sum+=k;
        return;
    }
    int mid=tr[now].l+tr[now].r>>1;
    if(i<=mid) add(now<<1,i,k);
    else add(now<<1|1,i,k);
    tr[now].sum=tr[now<<1].sum+tr[now<<1|1].sum;
    return;
}
int query(int now,int l,int r){
    if(tr[now].l>r||tr[now].r<l) return 0;
    if(tr[now].l>=l&&tr[now].r<=r){
        return tr[now].sum;
    }
    return query(now<<1,l,r)+query(now<<1|1,l,r);
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",a+i);
    }
    build(1,1,n);
    while(m--){
        int ch;
        scanf("%d",&ch);
        if(ch==1){
            int x,k;
            scanf("%d%d",&x,&k);
            add(1,x,k);
        }
        else{
            int x,y;
            scanf("%d%d",&x,&y);
            printf("%d\n",query(1,x,y));
        }
    }
    return 0;
}